package movilmax.sia_corp.action;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import utilidades.Cadena;
import movilmax.sia_corp.model.ListaSs;
import movilmax.sia_corp.model.Listax;
import movilmax.sia_corp.model.SolicitudSI;
import movilmax.sia_corp.model.Usuario;

import apli.conectar.Conectar;
import basedatos.Fecha;
import basedatos.Resultado;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class RegistroSolIntegral extends ActionSupport  {
	private static final long serialVersionUID = -6765609119963107028L;
	
	private SolicitudSI solicitud;
	private List<ListaSs> tabla_sa;
	private List<ListaSs> tabla_det;
	private List<Listax> lst_productos;
	private List<Listax> lst_sucursales;
	private String id_obj;
	
	@SuppressWarnings("rawtypes")
	public void validate(){	
		  try{	
			    if (this.getSolicitud().getCodigo().length() == 0 ){
				     this.addActionError( "Codigo invalido" );
					 return; 
			    }
			    if ( solicitud.getContrato().length() == 0 ){	
					 this.addActionError( "Debe ingresar el numero de contrato" );
					 return;
			    }
			    if ( solicitud.getObs().length() == 0 ){	
				     solicitud.setObs("NINGUNA");
			    }
			    Cadena C=new Cadena();
				LinkedList lst_suc=C.tokens(this.getSolicitud().getSucursal(), ",");
	  	    	LinkedList lst_pro=C.tokens(this.getSolicitud().getProducto(), ",");
	  	    	LinkedList lst_pre=C.tokens(this.getSolicitud().getPrecio(), ",");
				int ctd_val1=0,ctd_val2=0,ctd_val3=0;
				for(int i=0;i< lst_suc.size();i++){
					if(!lst_suc.get(i).toString().trim().equals("-1") && !lst_suc.get(i).toString().trim().equals("") )
	  	    			ctd_val1++;
	  	    		if(!lst_pro.get(i).toString().trim().equals("-1") && !lst_pro.get(i).toString().trim().equals("") )
	  	    			ctd_val2++;
	  	    		if(!lst_pre.get(i).toString().trim().equals("-1") && !lst_pre.get(i).toString().trim().equals("") )
	  	    			ctd_val3++;
				}
				if ( ctd_val1==0 || ctd_val2==0  || ctd_val3==0 ){	
					this.addActionError( "Debe seleccionar sucursal, producto y monto" );
					return;
				}
				for(int z=0;z<lst_suc.size(); z++){
					String dato1= lst_suc.get(z).toString().trim();
					String dato2= lst_pro.get(z).toString().trim();
					if(!dato1.equals("-1") && !dato2.equals("-1") ){
						int cp1=ninclusiones(lst_suc, dato1);
						int cp2=ninclusiones(lst_pro, dato2);
						if( cp1>1 && cp2>1 ){
							this.addActionError("Sucursal y producto estan duplicados" );
							return;
						}
					}
			    }
		  }catch(Exception err){
			 
		  }	
	}
	@SuppressWarnings("rawtypes")
	private int ninclusiones(LinkedList lst, String dato ){
		int n=0;
		String vx="";
		for(int i=0;i< lst.size();i++ ){
			    vx=lst.get(i).toString().trim();
	    		if( vx.equalsIgnoreCase(dato.trim()) ){
	    			n++;
	    		}
	    }	 
	    return n;
	}
	@SuppressWarnings("rawtypes")
	public String guardar_solicitud() throws Exception {
		Map session = ActionContext.getContext().getSession();
	    Usuario USUARIO = (Usuario)session.get("ses_usuario");
	    if (USUARIO!=null){		
	    	Conectar BASE= new Conectar();
	    	if(BASE.getMsg().equals("SI")){	
	    		try{
	    			Fecha F=new Fecha();
	    			String FECHA=F.getFecha();
	    			String HORA=F.getHoras();
	    			String SQL="";
	    			String CODIGO="",CABECERA="";
	    			Cadena C=new Cadena();
	    				LinkedList lst_suc1=C.tokens(this.getSolicitud().getSucursal(), ",");
  		    	    	LinkedList lst_prod=C.tokens(this.getSolicitud().getProducto(), ",");
  		    	    	LinkedList lst_mont=C.tokens(this.getSolicitud().getPrecio(), ",");
  		    	    	LinkedList lst_cods=C.tokens(this.getSolicitud().getCod_item(), ",");
	    				if (this.getSolicitud().getCodigo().equals("-1") ){
	    					CODIGO=BASE.getBaseDatos().generarCodigo("corp_solicitud_si","codigo");
	    					SQL="INSERT INTO corp_solicitud_si (codigo,contrato,obs,usuario,fecha,hora,status,fecha_act,hora_act,usuario_act,vendedor) VALUES('"+CODIGO +"','"+ this.getSolicitud().getContrato() +"','"+ this.getSolicitud().getObs() + "','"+ USUARIO.getUsuario()+"','"+ FECHA +"','"+HORA+"','1','"+ FECHA +"','"+HORA+"','"+USUARIO.getUsuario()+"','"+ USUARIO.getCod_vendedor() +"' )";
	    					CABECERA="NUEVA SOLICITUD DE SOLUCION INTEGRAL GENERADA CON CODIGO="+CODIGO;
	    				}else{
	    					CODIGO=this.getSolicitud().getCodigo();
	    					SQL="UPDATE corp_solicitud_si set obs='"+ this.getSolicitud().getObs() +"',status='2',usuario_act='"+ USUARIO.getUsuario() +"',fecha_act='"+FECHA+"',hora_act='"+HORA+"' where codigo='"+ CODIGO + "' ";
	    					CABECERA="SOLICITUD DE SOLUCION INTEGRAL CON CODIGO="+CODIGO+" ACTUALIZADA POR VENDEDOR";
	    				}
	    				BASE.getBaseDatos().ejecutar(SQL);
	    				for(int i=0; i<lst_suc1.size();i++){
	    					String cod=lst_cods.get(i).toString();
  		    	    		String suc=lst_suc1.get(i).toString();
  		    	    		String pro=lst_prod.get(i).toString();
  		    	    		String mon=lst_mont.get(i).toString();
  		    	    		if (cod.equals("-1")){
	  		    	    		if(!suc.equals("-1") && !pro.equals("-1") && !mon.equals("") && !mon.equals("0") ){
		  		    	    		SQL="INSERT INTO corp_solicitud_si_detalle " +
			  	  		    			"(solicitud,sucursal,producto,monto) "+
			  	  		    			"VALUES('"+CODIGO+"','"+suc+"','"+pro+"','"+mon+"' ) ";
	  		    	    		}
  		    	    	   }else{
  		    	    		   if(!suc.equals("-1") && !pro.equals("-1") && !mon.equals("") && !mon.equals("0") ){
	  		    	    		   SQL="UPDATE corp_solicitud_si_detalle SET " +
		  	  		    			  "producto='"+pro+"',monto='"+mon+"' Where cod='"+cod+"' ";  
  		    	    		   }   
  		    	    	   }
  		    	    	  BASE.getBaseDatos().ejecutar(SQL);
  		    	    	  this.addActionMessage(SQL);
  		    	     }
	    			String DESTINO=USUARIO.getEmail()+","+USUARIO.getEmail_sup(); 
  		    	    SQL="INSERT INTO corp_seguimiento_actividades_si (contrato,proceso,obs,usuario,fecha,hora) "+
  		    			"VALUES('"+this.getSolicitud().getContrato() +"','1000','"+ this.getSolicitud().getObs() +"','"+ USUARIO.getUsuario() +"','"+ FECHA +"','"+HORA+"' )";
  		    	    BASE.getBaseDatos().ejecutar(SQL); 
  		    	    String MSG_EM="";
  		    	    MSG_EM =MSG_EM+ "<br/>\n";
 				    MSG_EM = MSG_EM + "Cliente: " + this.getSolicitud().getContrato() +" - "+this.getSolicitud().getDes_cliente() + " <br/>\n";
	  				MSG_EM = MSG_EM + "Fecha status: "+new Fecha().getFecha()+" "+new Fecha().getHoras() +" <br/>\n";
	  				MSG_EM = MSG_EM + "Usuario status: "+ USUARIO.getDescripcion()+"<br/>\n";
	  				MSG_EM = MSG_EM + "Observaciones: "+ this.getSolicitud().getObs()+ "<br/>\n";
					SQL="INSERT INTO apli_emails (para,cabecera,mensaje) VALUES('" + DESTINO + "','"+CABECERA+"','" + MSG_EM + "' ) ";
					BASE.getBaseDatos().ejecutar(SQL);
  		    	    this.addActionMessage("Solicitud de solucion integral generada correctamente");
  		    	    this.addActionMessage("Copia enviada a :"+DESTINO+" ");
  		    	    this.addActionMessage("Actividad registrada con fecha : ("+ new Fecha().getFecha() +" "+ new Fecha().getHoras()  +" ) ");
  		    	    BASE.getBaseDatos().cerrarConexion();
  		    	    return SUCCESS; 	
	    	  }catch(Exception err  ){
				    this.addActionError("Error en registro: "+err.toString() );
				    err.printStackTrace();
			  }  
	    	  BASE.getBaseDatos().cerrarConexion();
		   }
		   else
			 this.addActionError("No hay conexion al servidor");  
	   } 
	  else
		  this.addActionError("La sesion del usuario ha caducado");   	
	
	   return ERROR;
	   
   } 
	
	
	@SuppressWarnings("rawtypes")
	public String cargar() throws Exception {
		Map session = ActionContext.getContext().getSession();
	    Usuario USUARIO = (Usuario)session.get("ses_usuario");
	    String SQL="";
	    if (USUARIO==null){	
	    	this.addActionError("La sesion del usuario ha caducado");
			return ERROR;
	    }
	    if(solicitud.getContrato().equals("")){
	    	this.addActionError("Debe indicar el numero de contrato");
				return ERROR;
	    }  
	    Conectar BASE= new Conectar();
	    tabla_sa= new ArrayList<ListaSs>();
	    if(BASE.getMsg().equals("SI")){	
  			SQL="Select T.nombres+' '+T.apellidos as des,T.identificacion,C.tipo,C.status " +
  				"From clientes T,contratos C Where C.contrato='"+solicitud.getContrato() + "' and C.cliente=T.codigo ";
  			Resultado RCS=BASE.getBaseDatos().consultar(SQL);
  			if(RCS.RP){
  				 if(RCS.getCadena("status").equals("ANULADO") ){
  					this.addActionError("No se puede procesar la solicitud el contrato = "+solicitud.getContrato()+", esta anulado");
  	 				return ERROR;
  				 }
  				 solicitud.setDes_cliente(RCS.getCadena("des"));
  				 solicitud.setDes_rif(RCS.getCadena("identificacion"));
  				 solicitud.setDes_status("NO REGISTRADA");
  				 solicitud.setStatus("1000");
  				 solicitud.setDes_obs("NINGUNA");
  				 solicitud.setFecha(new Fecha().getFecha());
  				 solicitud.setHora(new Fecha().getHoras());
  				 solicitud.setUsuario("NINGUNO");
  				 solicitud.setCodigo("-1");
  				 SQL="Select Z.cod,Z.descripcion as des_suc,P.descripcion as des_servicio,C.monto "+
					"From corp_sucursales Z,detalle_servicios_corp C,productos P "+
					"Where C.contrato='"+solicitud.getContrato()+"' and C.sucursal=Z.cod and C.servicio=P.codigo "+ 
					"and P.recurrente='1' order by P.descripcion ";	
  		  		 RCS=BASE.getBaseDatos().consultar(SQL);
  			  	 if(RCS.RP){
  			  		 do{
	  					  ListaSs LST=new ListaSs();
						  LST.setId(new Cadena().convertirStr(tabla_sa.size()+1));
						  LST.setDes_sucursal(RCS.getCadena("des_suc"));
						  LST.setDes_servicio(RCS.getCadena("des_servicio"));
		  				  LinkedList precio=new Cadena().tokens((new Cadena().convertirStr( RCS.getFloat("monto") )),".");
						  if( precio.get(1).toString().equals("0") )
							 LST.setPrecio(precio.get(0).toString());
						  else
							 LST.setPrecio(precio.get(0).toString()+"."+precio.get(1).toString()); 
						  tabla_sa.add(LST);
  				   }while(RCS.sigItem()); 	 
  			  	 }
  				 SQL="Select S.codigo,S.obs,S.status,S.usuario,U.descripcion as des_usuario,CONVERT(varchar(30),S.fecha_act,103) as fecham,S.hora_act as hora,X.descripcion as des_status  " +
  				 "From corp_solicitud_si S,contratos C,usuarios U,corp_status_sol X Where C.contrato='"+solicitud.getContrato() + "' and C.contrato=S.contrato and S.procesado='0' and S.status=X.cod and S.usuario_act=U.usuario ";
  				 RCS=BASE.getBaseDatos().consultar(SQL);
	  			 if(RCS.RP){
	  				 if(!RCS.getCadena("usuario").equals(USUARIO.getUsuario())  ){
	  					this.addActionError("La solicitud codigo ( "+RCS.getCadena("codigo")+" ) , ya esta siendo procesada por el usuario: "+RCS.getCadena("usuario")  );
	  	 				return ERROR;
	  				 }
	  				 solicitud.setCodigo(RCS.getCadena("codigo"));
	  				 solicitud.setDes_status(RCS.getCadena("des_status"));
	  				 solicitud.setStatus(RCS.getCadena("status")); 
	  				 solicitud.setDes_obs(RCS.getCadena("obs"));
	  				 solicitud.setFecha(RCS.getCadena("fecham"));
	  				 solicitud.setHora(RCS.getCadena("hora"));
	  				 solicitud.setUsuario(RCS.getCadena("des_usuario"));
	  			 }
	  			 cargar_detalle(BASE);
	  			 BASE.getBaseDatos().cerrarConexion();
  				 return SUCCESS;  	
  			}else
  				this.addActionError("El contrato ="+ solicitud.getContrato() +", es invalido"); 
  			BASE.getBaseDatos().cerrarConexion();
        }else
        	this.addActionError("No hay conexion al servidor");
        
	   return ERROR;  	
   }
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private String cargar_detalle(Conectar BASE ){
		int x=0;
		tabla_det= new ArrayList<ListaSs>();
		if( !this.getSolicitud().getCodigo().equals("-1") ){
			String SQL="Select D.cod,D.sucursal,D.producto,D.monto,Y.descripcion as des_producto,Z.descripcion as des_sucursal "+
	  		"From corp_solicitud_si_detalle D,corp_productos Y,corp_sucursales Z Where D.solicitud='"+ this.getSolicitud().getCodigo() + "' and D.producto=Y.cod and D.sucursal=Z.cod ";
	  		Resultado RCS=BASE.getBaseDatos().consultar(SQL);
		  	if(RCS.RP){
		  		 do{
					  ListaSs LST=new ListaSs();
					  LST.setId(new Cadena().convertirStr(tabla_det.size()+1));
					  LST.setCod(RCS.getCadena("cod")); 
					  LST.setSucursal(RCS.getCadena("sucursal"));
					  LST.setProducto(RCS.getCadena("producto"));
					  LST.setDes_sucursal(RCS.getCadena("des_sucursal"));
					  LST.setDes_producto(RCS.getCadena("des_producto"));
	  				  LinkedList precio=new Cadena().tokens((new Cadena().convertirStr( RCS.getFloat("monto") )),".");
					  if( precio.get(1).toString().equals("0") )
						 LST.setPrecio(precio.get(0).toString());
					  else
						 LST.setPrecio(precio.get(0).toString()+"."+precio.get(1).toString()); 
					  tabla_det.add(LST);
			   }while(RCS.sigItem()); 		 
		  	}
		 }
		 Map session = ActionContext.getContext().getSession();
		 String CTD= (String)session.get("ses_ctd_si");
		 if (CTD==null){
			 session.put("ses_ctd_si", "4");
			 CTD="4";
		 }
		 Cadena C=new Cadena();
		 int ctdx=C.convertirInt( CTD );
		 for(x=tabla_det.size();x<ctdx;x++){
			 ListaSs LST=new ListaSs();
			 LST.setId(new Cadena().convertirStr(tabla_det.size()+1));
			 LST.setCod("-1"); 
			 LST.setSucursal("-1");
			 LST.setProducto("-1");
			 LST.setDes_sucursal("Seleccione");
			 LST.setDes_producto("Seleccione");
			 LST.setPrecio("0"); 
			 tabla_det.add(LST);
		 }
		 session.put("ses_tabla_ss",tabla_det);
		return SUCCESS;
	}
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public String agregarItemZ(Conectar BASE){
		 Map session = ActionContext.getContext().getSession();
		 String CTD= (String)session.get("ses_ctd_si");
		 if (CTD==null){
			 session.put("ses_ctd_si", "1");
		 }else{
			 Cadena C=new Cadena();	
			 session.put("ses_ctd_si", C.convertirStr(C.convertirInt( CTD )+1 ) );
		 }
		 return cargar_detalle(BASE);
    }
	private String listar_sucursales(Conectar BASE){
		lst_sucursales= new ArrayList<Listax>();
			  try{	
		    	String SQL="Select X.cod,UPPER(X.descripcion) as descripcion "+
	    	      "From corp_sucursales X,detalle_servicios_corp C  "+
	    	      "where C.contrato='"+this.getSolicitud().getContrato()+"' and C.sucursal=X.cod Order by X.cod ASC"; 	
				Resultado RCS=BASE.getBaseDatos().consultar(SQL);
				  if(RCS.RP){
					  do{ 
						  Listax LST=new Listax();
						  LST.setCod(RCS.getCadena("cod"));
						  LST.setDescripcion(RCS.getCadena("descripcion"));
						  lst_sucursales.add(LST);
					  }while(RCS.sigItem()); 
				  }
			   }catch(Exception err ){
					//hubo un error ...
			   }  
		  return SUCCESS;
	} 
	private String listar_productos(Conectar BASE) {
		lst_productos= new ArrayList<Listax>();
			  try{
		       String SQL="Select X.cod,UPPER(X.descripcion) as descripcion "+
	    	      "From corp_productos X  where si='1'  Order by X.descripcion  "; 	 	

				Resultado  RCS=BASE.getBaseDatos().consultar(SQL);
				  if(RCS.RP){
					  do{ 
						  Listax LST=new Listax();
						  LST.setCod(RCS.getCadena("cod"));
						  LST.setDescripcion(RCS.getCadena("descripcion"));
						  lst_productos.add(LST);
					  }while(RCS.sigItem()); 
				  }
			   }catch(Exception err  ){
					//hubo un error .....
			}  
		  return SUCCESS;
	} 
	public String getJSON(){
		@SuppressWarnings("rawtypes")
		Map session = ActionContext.getContext().getSession();
		  Usuario USUARIO = (Usuario)session.get("ses_usuario");
		  if (USUARIO==null){
			  this.addActionError("La sesion del usuario ha caducado");
			  return ERROR;
		  }
		  Conectar BASE= new Conectar();
		  if(BASE.getMsg().equals("SI")){
			  listar_sucursales(BASE);
			  listar_productos(BASE);
			  BASE.getBaseDatos().cerrarConexion();
			  return SUCCESS;
		  }else{
			  this.addActionError("No hay conexion al servidor");
		      return ERROR;
		  }
     }
	
	public List<ListaSs> getTabla_sa() {
		return tabla_sa;
	}
	public void setTabla_sa(List<ListaSs> tabla_sa) {
		this.tabla_sa = tabla_sa;
	}
	public List<ListaSs> getTabla_det() {
		return tabla_det;
	}
	public void setTabla_det(List<ListaSs> tabla_det) {
		this.tabla_det = tabla_det;
	}
	public String getId_obj() {
		return id_obj;
	}
	public void setId_obj(String id_obj) {
		this.id_obj = id_obj;
	}
	public SolicitudSI getSolicitud() {
		return solicitud;
	}
	public void setSolicitud(SolicitudSI solicitud) {
		this.solicitud = solicitud;
	}
	public List<Listax> getLst_productos() {
		return lst_productos;
	}
	public void setLst_productos(List<Listax> lst_productos) {
		this.lst_productos = lst_productos;
	}
	public List<Listax> getLst_sucursales() {
		return lst_sucursales;
	}
	public void setLst_sucursales(List<Listax> lst_sucursales) {
		this.lst_sucursales = lst_sucursales;
	}
	
}
